package com.xxxx.yoyo.dao.impl;

import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.List;
import java.util.Map;

import com.xxxx.yoyo.bean.Order;
import com.xxxx.yoyo.dao.IOrderDao;
import com.xxxx.yoyo.util.DBUtils;

public class OrderDaoImpl implements IOrderDao {

	/**
	 * 向order表中添加一个订单
	 * @param order 订单
	 * @return 返回插入的条数
	 */
	@Override
	public int insertOrder(Order order) {
		//获取订单时间
		Date systime = order.getSystime();
		//时间的格式需要调整,必须和数据库要求的格式一致 yyyy-MM-dd HH:mm:ss
		SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
		//把日期对象转换为符合格式的字符串
		String systimeStr = sdf.format(systime);
		
		//表名order和mysql的order关键字重名了,会出现语法错误!!
		//解决办法是给表名添加着重符. Tab键上面的那个按键
		String sql = "INSERT INTO `order` (total, amount, status, paytype, systime, user_id) VALUES(?, ?, ?, ?, ?, ?)";
		int row = DBUtils.update(sql, order.getTotal(), order.getAmount(), order.getStatus(), order.getPaytype(), systimeStr, order.getUserId());
		return row;
	}

	
	/**
	 * 根据订单详情 查询订单id
	 * @param order 订单
	 * @return 返回订单的id
	 */
	@Override
	public int selectIdByOrder(Order order) {
		//获取下单时间
		Date systime = order.getSystime();
		//时间的格式需要调整,必须和数据库要求的格式一致 yyyy-MM-dd HH:mm:ss
		SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
		//把日期对象转换为符合格式的字符串
		String systimeStr = sdf.format(systime);
		
		//表名order和mysql的order关键字重名了,会出现语法错误!!
		//解决办法是给表名添加着重符. Tab键上面的那个按键
		String sql = "SELECT * FROM `order` WHERE total = ? AND amount = ? AND status = ? AND paytype = ? AND systime = ? AND user_id = ?";
		Order findedOrder = DBUtils.queryOne(sql, Order.class, order.getTotal(), order.getAmount(), order.getStatus(), order.getPaytype(),systimeStr, order.getUserId());
		//返回订单id
		return findedOrder.getId();
	}

	/**
	 * 根据订单id获取订单
	 * @param orderId 订单id
	 * @return 返回订单
	 */
	@Override
	public Order selectOrderById(int orderId) {
		String sql = "SELECT * FROM `order` WHERE id = ?";
		Order order = DBUtils.queryOne(sql, Order.class, orderId);
		return order;
	}

	/**
	 * 更新订单
	 * @param order 订单
	 * @return 返回更新的条数
	 */
	@Override
	public int updateOrder(Order order) {
		String sql = "UPDATE `order` SET total = ? , amount = ? , status = ? , paytype = ? , name = ? , phone = ? , address = ? , user_id = ? WHERE id = ?";
		int row = DBUtils.update(sql, order.getTotal(), order.getAmount(),order.getStatus(), order.getPaytype(), order.getName(),order.getPhone(),order.getAddress(), order.getUserId(), order.getId());
		return row;
	}


	/**
	 * 根据用户的id查询用户所有订单
	 * @param userId 用户id
	 * @return 返回用户所有订单
	 */
	@Override
	public List<Order> selectOrderListByUserId(int userId) {
		String sql = "SELECT * FROM `order` WHERE user_id = ? AND status != 0";
		List<Order> orderList = DBUtils.query(sql, Order.class, userId);
		return orderList;
	}

	/**
	 * 根据页码，每页条数查询订单列表
	 * @param page 页码
	 * @param size 每页条数
	 * @return 查询到的订单列表
	 */
	@Override
	public List<Order> selectOrderList(int page, int size) {
		String sql = "SELECT * FROM `order` WHERE status != 0 LIMIT ?, ?";
		List<Order> orderList = DBUtils.query(sql, Order.class, (page-1)*size, size);
		return orderList;
	}

	/**
	 * 获取订单的总条数
	 * @return 返回订单的总条数
	 */
	@Override
	public long selectOrderCount() {
		String sql = "SELECT count(*) AS count FROM `order` WHERE status != 0";
		Map<String,Object> map = DBUtils.queryOne(sql);
		long count = (long)map.get("count");
		return count;
	}

	/**
	 * 根据订单状态，页码，每页条数查询订单列表
	 * @param status 订单状态  1表示未付款，2表示已付款，3表示配送中，4表示已完成
	 * @param page 页码
	 * @param size 每页条数
	 * @return 返回查到的订单列表
	 */
	@Override
	public List<Order> selectOrderList(int status, int page, int size) {
		String sql = "SELECT * FROM `order` WHERE status = ? LIMIT ?,?";
		List<Order> orderList = DBUtils.query(sql, Order.class, status, (page-1)*size, size);
		return orderList;
	}

	/**
	 * 根据订单状态获取订单数量
	 * @param status 订单状态  1表示未付款，2表示已付款，3表示配送中，4表示已完成
	 * @return 返回订单数量
	 */
	@Override
	public long selectOrderCount(int status) {
		String sql = "SELECT count(*) AS count FROM `order` WHERE status = ?";
		Map<String,Object> map = DBUtils.queryOne(sql, status);
		long count = (Long)map.get ("count");
		return count;
	}

}
